/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Control;

import Control.exceptions.IllegalOrphanException;
import Control.exceptions.NonexistentEntityException;
import Control.exceptions.PreexistingEntityException;
import Entidad.Emisora;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Entidad.Registromonitoreoaudio;
import java.util.ArrayList;
import java.util.List;
import javax.transaction.UserTransaction;

/**
 *
 * @author pepe
 */
public class EmisoraJpaController extends GeneralJpaCpontroller<Object> implements Serializable {

    public EmisoraJpaController() {
        
    }
    
    public Emisora buscarPorDial(Float dial) {
        EntityManager em = getEntityManager();
        
        Query q = em.createQuery("SELECT e FROM Emisora e WHERE"+
                " e.dial = :dial");
        try{
            return (Emisora) q.setParameter("dial", dial).getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }
    
    public Emisora buscarEmisoraPorNombre(String nombre){
        Emisora e;
        EntityManager em = getEntityManager();
        try{
            return (Emisora) em.createQuery("SELECT e FROM Emisora e " +
                    "WHERE e.nombre = :nombre").setParameter("nombre", nombre)
                    .getSingleResult();
        }catch(Exception ex){
            System.out.println(ex);
            return null;
        }
    }
    
    public void create(Emisora emisora) throws PreexistingEntityException, Exception {
        if (emisora.getRegistromonitoreoaudioList() == null) {
            emisora.setRegistromonitoreoaudioList(new ArrayList<Registromonitoreoaudio>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<Registromonitoreoaudio> attachedRegistromonitoreoaudioList = new ArrayList<Registromonitoreoaudio>();
            for (Registromonitoreoaudio registromonitoreoaudioListRegistromonitoreoaudioToAttach : emisora.getRegistromonitoreoaudioList()) {
                registromonitoreoaudioListRegistromonitoreoaudioToAttach = em.getReference(registromonitoreoaudioListRegistromonitoreoaudioToAttach.getClass(), registromonitoreoaudioListRegistromonitoreoaudioToAttach.getRegistromonitoreoaudioPK());
                attachedRegistromonitoreoaudioList.add(registromonitoreoaudioListRegistromonitoreoaudioToAttach);
            }
            emisora.setRegistromonitoreoaudioList(attachedRegistromonitoreoaudioList);
            em.persist(emisora);
            for (Registromonitoreoaudio registromonitoreoaudioListRegistromonitoreoaudio : emisora.getRegistromonitoreoaudioList()) {
                Emisora oldEmisoraOfRegistromonitoreoaudioListRegistromonitoreoaudio = registromonitoreoaudioListRegistromonitoreoaudio.getEmisora();
                registromonitoreoaudioListRegistromonitoreoaudio.setEmisora(emisora);
                registromonitoreoaudioListRegistromonitoreoaudio = em.merge(registromonitoreoaudioListRegistromonitoreoaudio);
                if (oldEmisoraOfRegistromonitoreoaudioListRegistromonitoreoaudio != null) {
                    oldEmisoraOfRegistromonitoreoaudioListRegistromonitoreoaudio.getRegistromonitoreoaudioList().remove(registromonitoreoaudioListRegistromonitoreoaudio);
                    oldEmisoraOfRegistromonitoreoaudioListRegistromonitoreoaudio = em.merge(oldEmisoraOfRegistromonitoreoaudioListRegistromonitoreoaudio);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findEmisora(emisora.getIdEmisora()) != null) {
                throw new PreexistingEntityException("Emisora " + emisora + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Emisora emisora) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Emisora persistentEmisora = em.find(Emisora.class, emisora.getIdEmisora());
            List<Registromonitoreoaudio> registromonitoreoaudioListOld = persistentEmisora.getRegistromonitoreoaudioList();
            List<Registromonitoreoaudio> registromonitoreoaudioListNew = emisora.getRegistromonitoreoaudioList();
            List<String> illegalOrphanMessages = null;
            for (Registromonitoreoaudio registromonitoreoaudioListOldRegistromonitoreoaudio : registromonitoreoaudioListOld) {
                if (!registromonitoreoaudioListNew.contains(registromonitoreoaudioListOldRegistromonitoreoaudio)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Registromonitoreoaudio " + registromonitoreoaudioListOldRegistromonitoreoaudio + " since its emisora field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<Registromonitoreoaudio> attachedRegistromonitoreoaudioListNew = new ArrayList<Registromonitoreoaudio>();
            for (Registromonitoreoaudio registromonitoreoaudioListNewRegistromonitoreoaudioToAttach : registromonitoreoaudioListNew) {
                registromonitoreoaudioListNewRegistromonitoreoaudioToAttach = em.getReference(registromonitoreoaudioListNewRegistromonitoreoaudioToAttach.getClass(), registromonitoreoaudioListNewRegistromonitoreoaudioToAttach.getRegistromonitoreoaudioPK());
                attachedRegistromonitoreoaudioListNew.add(registromonitoreoaudioListNewRegistromonitoreoaudioToAttach);
            }
            registromonitoreoaudioListNew = attachedRegistromonitoreoaudioListNew;
            emisora.setRegistromonitoreoaudioList(registromonitoreoaudioListNew);
            emisora = em.merge(emisora);
            for (Registromonitoreoaudio registromonitoreoaudioListNewRegistromonitoreoaudio : registromonitoreoaudioListNew) {
                if (!registromonitoreoaudioListOld.contains(registromonitoreoaudioListNewRegistromonitoreoaudio)) {
                    Emisora oldEmisoraOfRegistromonitoreoaudioListNewRegistromonitoreoaudio = registromonitoreoaudioListNewRegistromonitoreoaudio.getEmisora();
                    registromonitoreoaudioListNewRegistromonitoreoaudio.setEmisora(emisora);
                    registromonitoreoaudioListNewRegistromonitoreoaudio = em.merge(registromonitoreoaudioListNewRegistromonitoreoaudio);
                    if (oldEmisoraOfRegistromonitoreoaudioListNewRegistromonitoreoaudio != null && !oldEmisoraOfRegistromonitoreoaudioListNewRegistromonitoreoaudio.equals(emisora)) {
                        oldEmisoraOfRegistromonitoreoaudioListNewRegistromonitoreoaudio.getRegistromonitoreoaudioList().remove(registromonitoreoaudioListNewRegistromonitoreoaudio);
                        oldEmisoraOfRegistromonitoreoaudioListNewRegistromonitoreoaudio = em.merge(oldEmisoraOfRegistromonitoreoaudioListNewRegistromonitoreoaudio);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = emisora.getIdEmisora();
                if (findEmisora(id) == null) {
                    throw new NonexistentEntityException("The emisora with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Emisora emisora;
            try {
                emisora = em.getReference(Emisora.class, id);
                emisora.getIdEmisora();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The emisora with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Registromonitoreoaudio> registromonitoreoaudioListOrphanCheck = emisora.getRegistromonitoreoaudioList();
            for (Registromonitoreoaudio registromonitoreoaudioListOrphanCheckRegistromonitoreoaudio : registromonitoreoaudioListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Emisora (" + emisora + ") cannot be destroyed since the Registromonitoreoaudio " + registromonitoreoaudioListOrphanCheckRegistromonitoreoaudio + " in its registromonitoreoaudioList field has a non-nullable emisora field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            em.remove(emisora);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Emisora> findEmisoraEntities() {
        return findEmisoraEntities(true, -1, -1);
    }

    public List<Emisora> findEmisoraEntities(int maxResults, int firstResult) {
        return findEmisoraEntities(false, maxResults, firstResult);
    }

    private List<Emisora> findEmisoraEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Emisora as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Emisora findEmisora(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Emisora.class, id);
        } finally {
            em.close();
        }
    }

    public int getEmisoraCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Emisora as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
